﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusGetInterfaceTool.h
 * @brief  获取接口 工具类。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-04-25
 *
 *********************************************************************/
#ifndef __FITKABAQUSGETINTERFACETOOL__H__
#define __FITKABAQUSGETINTERFACETOOL__H__

#include "FITKAbaqusAbstractAdaptor.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

 //前置声明
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKComponentManager)
ForwardDeclarNS(Interface, FITKModelSet)

namespace IO
{
    /**
     * @brief Abaqus 获取接口 工具类
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-04-25
     */
    class FITKAbaqusGetInterfaceTool : QObject
    {
    public:
        explicit FITKAbaqusGetInterfaceTool() = default;
        ~FITKAbaqusGetInterfaceTool() = default;

        /**
         * @brief 设置算例数据对象
         * @param caseData
         * @param partID 部件ID
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-25
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData, int partID = -1);

        /**
         * @brief 通过名称获取集合ID - 是复合集合就获取复合集合id
         * @param[i] setName 集合名称
         * @param[i] type 类型 -1:All Interface::FITKModelEnum::FITKModelSetType
         * @param[o] id : instanceID or assemblyID
         * @return setID 集合ID
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-23
         */
        int getSetIDByName(QString setName, int type, int& id);
        /**
         * @brief  通过名称创建集合ID
         * @param[i] strData 集合名称
         * @param[i] type 类型 -1:All Interface::FITKModelEnum::FITKModelSetType
         * @param[o] id : instanceID or assemblyID
         * @return setID 集合ID
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date   2024-11-26
         */
        int createSetByStrData(QString strData, int type, int& id);

        /**
         * @brief 通过名称获取表面ID
         * @param[i] surfName 表面名称
         * @param[i] type 类型 -1:All Interface::MeshSurfaceType
         * @param[o] modelID instanceID or partID
         * @return SurfID 表面ID
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-23
         */
        int getSurfIDByName(QString surfName, int type, int& modelID);
        /**
         * @brief  通过名称创建表面ID
         * @param[i] strData 表面名称
         * @param[i] polygonData 表面位置
         * @param[i] type 类型 -1:All Interface::FITKModelEnum::FITKModelSetType
         * @param[o] id : instanceID or assemblyID
         * @return surfID 集合ID
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date   2024-11-26
         */
        int createSurfByStrData(QString strData, QString polygonData, int type, int& id);

        /**
         * @brief 打印控制台消息
         * @param[i] level 打印级别 1 normal 2 warning 3error
         * @param[i] str 数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-07
         */
        void consoleMessage(int level, const QString& str);

        /**
         * @brief 通过名称获取集合id以及模型id
         * @param[i] setName 表面名称
         * @param modelId 模型id instanceID or partID
         * @return Interface::FITKModelSet* 集合
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-23
         */
        Interface::FITKModelSet* getSetIDByNamePrivate(QString setName, int& modelId);

    private:

        /**
         * @brief 模型数据是否包含集合类型
         * @param[i] setData 模型数据
         * @param[i] type 类型 Interface::FITKModelEnum::FITKModelSetType
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-19
         */
        bool isContainSetType(Interface::FITKModelSet* setData, int type);

        /**
         * @brief 通过名称获取表面ID
         * @param name 表面名称
         * @param type 类型
         * @param modelID instanceID or partID
         * @return SurfID 表面ID
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-23
         */
        int getSurfIDByNamePrivate(QString name, int type, int& modelID);

    private:

        /**
         * @brief 算例数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-25
         */
        AbaqusData::FITKDataCase* _caseData{};
        /**
         * @brief partId
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-19
         */
        int _partID{ -1 };
    };
}

#endif
